/* 
  1.  Promise 就是一个类，在执行这个类的时候，需要传递一个执行器进去，执行器会立即执行
  2.  Promise 有3种状态，等待 pending 成功 fullFilled 失败 rejected
      pending => fullFilled
      pending => rejected
      一旦状态确定就不能更改
  3.  resolve和reject用来更改状态
      resolve => fullFIlled
      reject => rejected
  4.  then方法内部做的事情就是判断状态，如果状态是成功，调用成功的回调函数，如果状态是失败，就调用失败的回调函数。then 方法是被定义在原型对象中的
  5.  then 成功回调有一个参数，表示成功之后的值，then 失败回调有一个参数，表示失败之后的原因
*/

const myPromise = require('./myPromise')

let promise = new myPromise((resolve, reject) => {
  // setTimeout(() => {
    // throw new Error('执行器错误')
    resolve('成功了')
  // }, 2000)
  // reject('失败了')
})

function other () {
  return new myPromise((resolve, reject) => {
    resolve('other')
  })
}

function p1 () {
  return new myPromise((resolve, reject) => {
    setTimeout(() => {
      resolve('p1')
      reject('p1 reject')
    }, 2000)
  }).catch(reason => {console.log(reason)})
}

function p2 () {
  return new myPromise((resolve, reject) => {
    // resolve('p2 resolve')
    reject('p2 reject')
  })
}

p2().then(value => {console.log(value)}).catch(reason => {console.log('22', reason)})
// myPromise.all(['a','b',p1(),p2()]).then(result => {
//   console.log(result)
// })

// myPromise.resolve(p1()).then(result => {
//   console.log(result)
// })

// p2().finally(() => {
//   console.log('finally')
//   return p1()
// }).then(value => {
//   console.log(value)
// }, reason => {
//   console.log(reason)
// })

// promise.then().then().then().then().then(value => {
//   console.log('111')
//   console.log(value)
// }, reason => {
//   console.log(reason)
// })

// 错误写法，promise 调用自身
// let p1 = promise.then(value => {
//   console.log(value)
//   return p1
// })

// p1.then(value => {
//   console.log(value)
// }, reason => {
//   console.log(reason)
// })